0200 struct buf;
0201 struct context;
0202 struct file;
0203 struct inode;
0204 struct pipe;
0205 struct proc;
0206 struct spinlock;
0207 struct stat;
0208 
0209 // bio.c
0210 void            binit(void);
0211 struct buf*     bread(uint, uint);
0212 void            brelse(struct buf*);
0213 void            bwrite(struct buf*);
0214 
0215 // console.c
0216 void            consoleinit(void);
0217 void            cprintf(char*, ...);
0218 void            consoleintr(int(*)(void));
0219 void            panic(char*) __attribute__((noreturn));
0220 
0221 // exec.c
0222 int             exec(char*, char**);
0223 
0224 // file.c
0225 struct file*    filealloc(void);
0226 void            fileclose(struct file*);
0227 struct file*    filedup(struct file*);
0228 void            fileinit(void);
0229 int             fileread(struct file*, char*, int n);
0230 int             filestat(struct file*, struct stat*);
0231 int             filewrite(struct file*, char*, int n);
0232 
0233 // fs.c
0234 int             dirlink(struct inode*, char*, uint);
0235 struct inode*   dirlookup(struct inode*, char*, uint*);
0236 struct inode*   ialloc(uint, short);
0237 struct inode*   idup(struct inode*);
0238 void            iinit(void);
0239 void            ilock(struct inode*);
0240 void            iput(struct inode*);
0241 void            iunlock(struct inode*);
0242 void            iunlockput(struct inode*);
0243 void            iupdate(struct inode*);
0244 int             namecmp(const char*, const char*);
0245 struct inode*   namei(char*);
0246 struct inode*   nameiparent(char*, char*);
0247 int             readi(struct inode*, char*, uint, uint);
0248 void            stati(struct inode*, struct stat*);
0249 int             writei(struct inode*, char*, uint, uint);
0250 // ide.c
0251 void            ideinit(void);
0252 void            ideintr(void);
0253 void            iderw(struct buf*);
0254 
0255 // ioapic.c
0256 void            ioapicenable(int irq, int cpu);
0257 extern uchar    ioapicid;
0258 void            ioapicinit(void);
0259 
0260 // kalloc.c
0261 char*           kalloc(void);
0262 void            kfree(char*);
0263 void            kinit();
0264 
0265 // kbd.c
0266 void            kbdintr(void);
0267 
0268 // lapic.c
0269 int             cpunum(void);
0270 extern volatile uint*    lapic;
0271 void            lapiceoi(void);
0272 void            lapicinit(int);
0273 void            lapicstartap(uchar, uint);
0274 void            microdelay(int);
0275 
0276 // mp.c
0277 extern int      ismp;
0278 int             mpbcpu(void);
0279 void            mpinit(void);
0280 void            mpstartthem(void);
0281 
0282 // picirq.c
0283 void            picenable(int);
0284 void            picinit(void);
0285 
0286 // pipe.c
0287 int             pipealloc(struct file**, struct file**);
0288 void            pipeclose(struct pipe*, int);
0289 int             piperead(struct pipe*, char*, int);
0290 int             pipewrite(struct pipe*, char*, int);
0291 
0292 // proc.c
0293 struct proc*    copyproc(struct proc*);
0294 void            exit(void);
0295 int             fork(void);
0296 int             growproc(int);
0297 int             kill(int);
0298 void            pinit(void);
0299 void            procdump(void);
0300 void            scheduler(void) __attribute__((noreturn));
0301 void            sched(void);
0302 void            sleep(void*, struct spinlock*);
0303 void            userinit(void);
0304 int             wait(void);
0305 int		wait2(int*, int*);
0306 void            wakeup(void*);
0307 void            yield(void);
0308 int		nice(void);
0309 
0310 // swtch.S
0311 void            swtch(struct context**, struct context*);
0312 
0313 // spinlock.c
0314 void            acquire(struct spinlock*);
0315 void            getcallerpcs(void*, uint*);
0316 int             holding(struct spinlock*);
0317 void            initlock(struct spinlock*, char*);
0318 void            release(struct spinlock*);
0319 void            pushcli();
0320 void            popcli();
0321 
0322 // string.c
0323 int             memcmp(const void*, const void*, uint);
0324 void*           memmove(void*, const void*, uint);
0325 void*           memset(void*, int, uint);
0326 char*           safestrcpy(char*, const char*, int);
0327 int             strlen(const char*);
0328 int             strncmp(const char*, const char*, uint);
0329 char*           strncpy(char*, const char*, int);
0330 
0331 // syscall.c
0332 int             argint(int, int*);
0333 int             argptr(int, char**, int);
0334 int             argstr(int, char**);
0335 int             fetchint(struct proc*, uint, int*);
0336 int             fetchstr(struct proc*, uint, char**);
0337 void            syscall(void);
0338 
0339 // timer.c
0340 void            timerinit(void);
0341 
0342 // trap.c
0343 void            idtinit(void);
0344 extern uint     ticks;
0345 void            tvinit(void);
0346 extern struct spinlock tickslock;
0347 
0348 
0349 
0350 // uart.c
0351 void            uartinit(void);
0352 void            uartintr(void);
0353 void            uartputc(int);
0354 
0355 // vm.c
0356 void            ksegment(void);
0357 void            kvmalloc(void);
0358 void            vmenable(void);
0359 pde_t*          setupkvm(void);
0360 char*           uva2ka(pde_t*, char*);
0361 int             allocuvm(pde_t*, uint, uint);
0362 int             deallocuvm(pde_t*, uint, uint);
0363 void            freevm(pde_t*);
0364 void            inituvm(pde_t*, char*, uint);
0365 int             loaduvm(pde_t*, char*, struct inode *, uint, uint);
0366 pde_t*          copyuvm(pde_t*,uint);
0367 void            switchuvm(struct proc*);
0368 void            switchkvm();
0369 
0370 // number of elements in fixed-size array
0371 #define NELEM(x) (sizeof(x)/sizeof((x)[0]))
0372 
0373 
0374 
0375 
0376 
0377 
0378 
0379 
0380 
0381 
0382 
0383 
0384 
0385 
0386 
0387 
0388 
0389 
0390 
0391 
0392 
0393 
0394 
0395 
0396 
0397 
0398 
0399 
